//
//  main.m
//  Ios 新特性 （Nullability,泛型，——kindof）
//
//  Created by dllo on 16/7/13.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Truck.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
    //nunull 修饰的属性 对应的getter和setter 方法
    Person *person = [[Person alloc]init];
    NSString *objc = nil;
    person.name = objc;
    [person setName:objc];
    person.name = @"zhangsan";
    
    //nullabel 修饰的属性  对应的getter 和setter 方法
    person.sex = nil;
    
    //2.泛型
  //带泛型的容器 (规定了容器中所储存的类型)
    //声明一个可变数组，内部存放的都是NSString;
    // 1.数组中添加其他类型，会有警告
    //2. 数组中取出来的类型不再是id类型， 对应变成声明时的类型
    //3. 泛型会改变类的一些方法 使与声明的类型相同
    NSMutableArray <NSString *> *marr = [NSMutableArray arrayWithObjects:@"asd", nil];
    
    [marr.firstObject length];
    [marr addObject:@""];
//    [marr addObject:@20];
//    [marr addObject:person];
//    
    NSInteger integer = [[marr objectAtIndex:0]length];
    
    //带泛型的字典
    NSMutableDictionary <NSString *,NSString *> *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"xiaoming",@"name", nil];
    
    [[dic objectForKey:@"name"]length];
    
    //自定义泛型
    Truck <Person *> *truckPer = [[Truck alloc]init];
    [truckPer addObject:person];
    
    Student *stu = [[Student alloc]init];
    stu.stuNumber = @"16010150";
    [truckPer addObject:stu];
    Truck <Student *> *truckStu = [[Truck alloc]init];
    [truckStu addObject:stu];
   // [truckStu addObject:person];
    [truckPer addObject:stu];
    
    //  协变性 和 逆变性
    Truck *truck = nil;
    Truck<NSArray *> *truck1 = nil;
    Truck <NSMutableArray *>*truck2 = nil;
    //大类型（任意类型） 可以给有泛型的赋值
    // 也可以有泛型的给它赋值
    truck = truck1;
    truck = truck2;
    truck1 = truck;
    truck2 = truck;
    
    
    
    
    
    // __covariant 协变性  子类在给父类赋值时， 自动強转
   // Truck<NSArray *> 与 Truck <NSMutableArray *>
    truck1 = truck2;
    // 逆变 __contravariant 父类给子类赋值时 自动強转 （没用过）
  //  truck2 = truck1;
    
  //3.__kind of
    /** 加__kindof修饰后   返回的类型及其子类 都可以接受这个返回值 */
    
    Truck *trukKindOf = [[Truck alloc]init];
     NSMutableArray *arr = [trukKindOf returnArray];
    
    NSArray *arr1 = [trukKindOf returnArray];
    
    
    return 0;
}
